/**
 * 校验器
 * 
 * 参数（可选）：
 * （1）data：校验器参数
 * （2）str：输入内容
 * （3）checkerErrMsg： 错误信息
 * （4）组件输入内容最大长度，优先级最高，需要在涉及到长度的校验器中进行处理，如长度校验需要校验的长度必须小于或等于输入域允许输入的最大长度
 */
export default class Checker {
    
    //非空校验器
    isEmptyValidator(data, str, checkerErrMsg){
        let errMsg = '校验失败';
        if(checkerErrMsg){
            errMsg = checkerErrMsg;
        }else if(data && data.errMsg) {
            errMsg = data.errMsg;
        }
        if(str){
            let regex = /^[ ]*$/;
            if(regex.test(str)){
                return {"result":false, "message":errMsg};
            }else {
                return {"result":true, "message":"检验成功"};
            }
        }else{
            return {"result":false, "message":errMsg};
        }
    }

    //长度检验器，组件本身的maxLength属性优先级高，maxLength默认值是50，在做长度校验时，请保证contentLength小于或等于maxLength,如contentLength大于maxLength则默认校验通过;如contentLength的值配置为0或未配置，默认也是校验通过
    //maxLength为TextField组件传入的数据，单独调用时可以不传，js和java不同，没有重载
    lengthValidator(data, str, checkerErrMsg, maxLength){
        if(data){
            if(data.contentLength == undefined){
                console.warn("校验长度为空！");
            }else if(data.contentLength < 0){
                console.warn("校验长度小于0！");
            }else if(maxLength != 0 && maxLength != undefined && data.contentLength > maxLength) {
                console.warn("校验长度大于组件输入域可输入的最大长度！");
            }else {
                if(str.length === data.contentLength) {
                    return {"result":true, "message":"检验成功"};
                }else {
                    let errMsg = '校验失败';
                    if(checkerErrMsg){
                        errMsg = checkerErrMsg;
                    }else if(data && data.errMsg) {
                        errMsg = data.errMsg;
                    }
                    return {"result":false, "message":errMsg};
                }
            }
        }           
        return {"result":true, "message":"检验成功"};
    }

    //正则校验器
    regexValidator(data, str, checkerErrMsg) {
        let errMsg = '校验失败';
        if(checkerErrMsg){
            errMsg = checkerErrMsg;
        }else if(data && data.errMsg) {
            errMsg = data.errMsg;
        }
        if(data && data.expression){
            let parts = /\/(.*)\/(.*)/.exec(data.expression);
            let restoredRegex = new RegExp(parts[1], parts[2]);
            if(restoredRegex.test(str)){
                return {"result":true, "message":"检验成功"};
            }else {
                return {"result":false, "message":errMsg};
            }
        }
        return {"result":true, "message":"检验成功"};
    }

    //取值区间校验器,区间最小值大于等于0，区间最大值小于等于maxLength,单独调用时，不存在maxLength，此时maxNumber默认值为0
    //maxLength为TextField组件传入的数据，单独调用时可以不传，js和java不同，没有重载
    rangesValidator(data, str, checkerErrMsg, maxLength) {
        //确定取值区间，如未配置参数，则默认最大值为maxLength，最小值为0,如果区间配置最大值小于最小值则默认不再进行校验，按校验成功处理。
        let maxNumber = 0;
        let minNumber = 0;
        if(data && data.max != undefined && data.min != undefined){
            if(data.max < data.min){
                console.warn("区间配置有误！");
                return {"result":true, "message":"检验成功"};
            }
        }

        if(data && (data.max == undefined || data.min == undefined)) {
            console.warn("最大值或最小值未配置！");
            return {"result":true, "message":"检验成功"};
        }

        if(data && data.max != undefined && data.max > 0){
            if (maxLength != undefined && data.max > maxLength) {
                maxNumber = maxLength;
            }else {
                maxNumber = data.max;                
            }
        }

        if(data && data.min != undefined && data.min > 0) {
            minNumber = data.min;
        }
        //最小值校验
        if(str.length < minNumber) {
            if(checkerErrMsg) {
                return {"result":false, "message":checkerErrMsg};
            }else if (data && data.minErrMsg) {
                return {"result":false, "message":data.minErrMsg};
            }else {
                return {"result":false, "message":"检验失败"};
            }
        }
        //最小值校验
        if(str.length > maxNumber) {
            if(checkerErrMsg) {
                return {"result":false, "message":checkerErrMsg};
            }else if (data && data.maxErrMsg) {
                return {"result":false, "message":data.maxErrMsg};
            }else {
                return {"result":false, "message":"检验失败"};
            }
        }
        return {"result":true, "message":"检验成功"};
    }
    //枚举校验器
    enumValidator(data, str, checkerErrMsg) {
        let errMsg = '校验失败';
        if(checkerErrMsg){
            errMsg = checkerErrMsg;
        }else if(data && data.errMsg) {
            errMsg = data.errMsg;
        }   
        if(data && data.enumeration) {
            let dataArray = data.enumeration.split(',');
            for(let i=0;i<dataArray.length;i++) {
                if(str == dataArray[i]){
                    return {"result":true, "message":"检验成功"};
                }
            }
        }
        return {"result":false, "message":errMsg};
    }
}